package fr.iut.tp3.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import fr.iut.tp3.Context;
import fr.iut.tp3.controller.commands.CAuthentifier;
import fr.iut.tp3.controller.commands.CQuitter;
import fr.iut.tp3.controller.commands.Commande;
import fr.iut.tp3.controller.events.Event;
import fr.iut.tp3.controller.events.EventDispatcher;
import fr.iut.tp3.controller.events.EventListener;
import fr.iut.tp3.view.listeners.EnterKeyListener;
import fr.iut.tp3.view.listeners.LoginBtnListener;

public class LoginView extends JDialog implements EventListener {

	private static final long serialVersionUID = -4510271913343238109L;

	/** URL de l'icone. */
	private static final String ICON_URL = "http://www.oathealth.com/blog/wp-content/themes/CitrusTheme_SingleUse/images/blank-avatar.png";

	/** Le panneau principal. */
	private JPanel mainPanel = new JPanel(new BorderLayout());

	/** Le panneau du formulaire. */
	private JPanel formPanel = new JPanel(new GridLayout(3, 2));

	private JPanel btnPanel = new JPanel();

	/** Le label des erreurs. */
	private JLabel errorLbl = new JLabel();

	/** Le champ pour l'identifiant. */
	private JTextField loginField = new JTextField("admin");

	/** Le champ pour le mot de passe. */
	private JPasswordField passwordField = new JPasswordField("admin");

	/** Le bouton pour se connecter. */
	private JButton connectBtn = new JButton("Connecter");

	/** Le bouton pour quitter. */
	private JButton quitBtn = new JButton("Quitter");

	/** La service de contrôle des utilisateurs. */
	private Context context;

	/**
	 * Vue dédiée à la connexion de l'utilisateur.
	 */
	public LoginView(Context pContext) {
		// Récupération du service des utilisateurs.
		this.context = pContext;

		// Création du panneau.
		createPanel();

		// Ajout des listeners.
		addListeners();

		// Enregistrement auprès du dispatcher.
		EventDispatcher.getInstance().registerListener(this);
	}

	/**
	 * Ajout des listeners.
	 */
	private void addListeners() {
		// Les commandes.
		Commande authentifier = new CAuthentifier(context, loginField, passwordField);
		Commande quitter = new CQuitter();

		// Définir les actions.
		LoginBtnListener listener = new LoginBtnListener(authentifier, quitter);
		connectBtn.setActionCommand("connect");
		quitBtn.setActionCommand("quit");

		// Ajout des listeners.
		connectBtn.addActionListener(listener);
		quitBtn.addActionListener(listener);

		loginField.addKeyListener(new EnterKeyListener(connectBtn));
		passwordField.addKeyListener(new EnterKeyListener(connectBtn));
	}

	/**
	 * Création du panneau.
	 */
	private void createPanel() {
		// Ajout des composants au panneau principal.
		errorLbl.setForeground(Color.RED);
		formPanel.add(new JLabel("Login :"));
		formPanel.add(loginField);
		formPanel.add(new JLabel("Password :"));
		formPanel.add(passwordField);
		btnPanel.add(connectBtn);
		btnPanel.add(quitBtn);

		// Composition du panneau final.
		mainPanel.add(getIcon(), BorderLayout.WEST);
		mainPanel.add(errorLbl, BorderLayout.NORTH);
		mainPanel.add(formPanel, BorderLayout.CENTER);
		mainPanel.add(btnPanel, BorderLayout.SOUTH);

		setContentPane(mainPanel);
	}

	/**
	 * Affiche la vue.
	 * @param asyncCallback : la callback qui contient le traitement à effectuer lors de la réussite de la connexion.
	 * @throws MalformedURLException 
	 * @throws HeadlessException 
	 */
	public void rendreVisible() {
		pack();
		setVisible(true);
	}

	/**
	 * Retourne une icone récupérée sur Internet si possible,
	 * sinon renvoie nul.
	 * @throws MalformedURLException
	 */
	private JLabel getIcon() {
		try {
			return new JLabel(new ImageIcon(new URL(ICON_URL)));
		} catch (MalformedURLException e) {
			return new JLabel();
		}
	}

	@Override
	public void onEvent(Event event) {
		switch (event) {
		case LOGIN_FAILURE:
			errorLbl.setText("Erreur de connexion, vérifiez vos identifiants.");
			break;
		case LOGIN_SUCCESS:
			setVisible(false);
			break;
		default:
			break;
		}
	}
}
